﻿using System;

using EPiServer.Common;
using EPiServer.Common.Tags;
using EPiServer.Community;
using EPiServer.PlugIn;


namespace EPiServer.Templates.RelatePlus.Templates.PageEntity.TagBox
{
    [GuiPlugIn(DisplayName = "TagBox", Description = "Tagging control for PageEntity", Area = PlugInArea.EditPanel, Url = "~/Templates/PageEntity/TagBox/TagBoxPlugin.ascx")]
    public partial class TagBoxPlugin : UserControlBase
    {
        private PageEntity _currentPageEntity;

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            this.TagBoxCtrl.ClientDataAvailable += new EventHandler(TagBoxCtrl_ClientUpdate);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (!IsPostBack)
            {
                _currentPageEntity = PageEntityHandler.GetPageEntityByGUID(CurrentPage.PageGuid);

                if (_currentPageEntity != null)
                {
                    TagBoxCtrl.Tags = GetTagsFromCurrentEntity();
                }
                else
                {
                    TagBoxCtrl.Tags = new TagCollection();
                }

                DataBind();
            }
        }

        protected void TagBoxCtrl_ClientUpdate(object sender, EventArgs e)
        {

            // Try to load the current PageEntity again. It may have been created since this control was loaded.
            _currentPageEntity = PageEntityHandler.GetPageEntityByGUID(CurrentPage.PageGuid);

            PageEntity pageEntityToTag;

            if (_currentPageEntity == null)
            {
             
                pageEntityToTag = (PageEntity)PageEntityHandler.AddPageEntity((PageEntity)Activator.CreateInstance(PageEntityUtils.GetPageEntityType(CurrentPage), CurrentPage.PageGuid, SiteHandler.CurrentSite)).Clone();
            }
            else
            {
                pageEntityToTag = (PageEntity)_currentPageEntity.Clone();
            }

            if (TagBoxCtrl.Tags.Count == 0)
            {
                pageEntityToTag.EntityTags.Clear();
            }
            else
            {
                // do
                pageEntityToTag.EntityTags.SelectiveAdd(TagBoxCtrl.Tags, CommunitySystem.CurrentContext.DefaultSecurity.CurrentUser);
            }

            PageEntityHandler.UpdatePageEntity(pageEntityToTag);
            _currentPageEntity = pageEntityToTag;

            TagBoxCtrl.Tags = GetTagsFromCurrentEntity();
        }
        
        private TagCollection GetTagsFromCurrentEntity()
        {
            TagCollection tagBoxTags = new TagCollection();

            foreach (EntityTag eTag in _currentPageEntity.EntityTags)
            {
                tagBoxTags.Add(eTag.Tag);
            }

            return tagBoxTags;
        }
    }
}